#include "sqlite.h"
/*插入或修改历史记录*/
int insert_or_update_history_record(sqlite3 *pdb,const char *username,const char *word){ 
    int ret = 0;
    char sql[128]= ""; 
    int rows = 0 ;
    int cols = 0;
    char * perrmsg = NULL;
    char **presult ;
    /*1. 查询历史记录表中是否存在记录的用户名字段、单词字段为形参指示的内容*/	
    sprintf(sql,"SELECT * FROM history WHERE name ='%s'and word = '%s'",username,word);
    ret = my_sqlite3_get_table(pdb,sql,&presult,&rows,&cols,&perrmsg);  
    if(ret != SQLITE_OK){
	    fprintf(stderr, "Error in sqlite3_get_table: %s\n", perrmsg);
	    sqlite3_free(perrmsg);
	    sqlite3_free_table(presult);
	    perrmsg = NULL;
	    pdb = NULL;
	    return -1;
    }
    printf("%d\n",rows);

    /*2. 存在则：修改存在记录的时间字段为当下时刻的时间*/
    if(rows > 0){
        sprintf(sql, "UPDATE history SET time = datetime('now','localtime') WHERE name = '%s' AND word = '%s'", username, word);
    }
    /*3. 不存在则：插入新记录*/
    else{
        sprintf(sql, "INSERT INTO history(name, time, word) VALUES('%s', datetime('now','localtime'), '%s')", username, word);
    }
    ret = sqlite3_exec(pdb, sql, NULL, NULL, &perrmsg);
    if (ret != SQLITE_OK) {
        fprintf(stderr, "Error in sqlite3_exec: %s\n", perrmsg);  
        sqlite3_free(perrmsg);
        sqlite3_free_table(presult);
        return (rows > 0) ? -2 : -3;
    }

    return 0;
}

/*从历史记录表中查询指定用户名的所有记录的时间、单词字段值，组合成如下形式的字符串：
	“记录1时间字段内容#记录1单词字段内容@记录2时间字段内容#记录2单词字段内容@......”*/
char *get_all_history_record_by_username(sqlite3 *pdb,const char *username){
    char sql[128];
    /*1. 查询所有用户名为形参指定的所有记录，只需获得每条记录的时间字段内容和单词字段内容*/
    sprintf(sql, "SELECT time, word FROM history WHERE name = '%s'", username);
    char **presult = NULL;
    char *perrmsg = NULL;
    int rows = 0;
    int cols = 0;
    int ret = 0;
    ret = sqlite3_get_table(pdb, sql, &presult, &rows, &cols, &perrmsg);
    if (ret != SQLITE_OK) {
        fprintf(stderr, "Error in sqlite3_get_table: %s\n", perrmsg);
        sqlite3_free(perrmsg);
        return NULL;
    }
    
    /*2. 计算存放最终字符串所需的空间大小：
    嵌套循环遍历查询结果统计所有字符串的长度和 + #个数 + @个数 + 1*/
    int total_length = 0;
    for (int i = 1; i <= rows; i++) {
        total_length += strlen(presult[i * cols]) + strlen(presult[i * cols + 1]) + 2;  // 字段之间有 '#' '@'
    }
    total_length += 1; // 结束符
    
    /*3. 动态分配存放最终字符串的空间*/
    char *result = (char *)malloc(total_length);
    if (!result){
        sqlite3_free_table(presult);
        return NULL;
    }

    result[0] = '\0'; // 初始化为空字符串

    /*4. 组合最终字符串：嵌套循环遍历查询结果，挨个字段调用strcat连接字段内容和"#"、“@”*/
    for (int i = 1; i <= rows; i++){
        strcat(result, presult[i * cols]);
        strcat(result, "#");
        strcat(result, presult[i * cols + 1]);
        if (i < rows) {
	        strcat(result, "@");
	    }
    }
    /*5. 成功返回动态空间首地址，失败返回NULL*/
    sqlite3_free_table(presult);
    return result;
}

